// Header Protection
#ifndef _GLEXT_H_
#define _GLEXT_H_

// Include Files
#include "Definitions.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <gl\GL.h>

// Namespace
namespace IE
{
	// Initialization
	extern bool GLExtInit();

	//glActiveShaderProgram
	//glActiveTexture
	//----------glAttachShader
	//----------glBeginConditionalRender
	//glBeginQuery
	//glBeginQueryIndexed
	//----------glBeginTransformFeedback
	//----------glBindAttribLocation
	//----------glBindBuffer
	//----------glBindBufferBase
	//----------glBindBufferRange
	//----------glBindFragDataLocation
	//glBindFragDataLocationIndexed
	//glBindFramebuffer
	//glBindProgramPipeline
	//glBindRenderbuffer
	//glBindSampler
	//glBindTexture
	//glBindTransformFeedback
	//----------glBindVertexArray
	//glBlendColor
	//glBlendEquation
	//glBlendEquationSeparate
	//glBlendFunc
	//glBlendFuncSeparate
	//glBlitFramebuffer
	//----------glBufferData
	//----------glBufferSubData
	//glCheckFramebufferStatus
	//----------glClampColor
	//glClear
	//glClearBuffer                                                   <--- more than one?
	//glClearColor
	//glClearDepth
	//glClearStencil
	//glClientWaitSync
	//glColorMask
	//----------glColorMaski
	//----------glCompileShader
	//glCompressedTexImage1D
	//glCompressedTexImage2D
	//glCompressedTexImage3D
	//glCompressedTexSubImage1D
	//glCompressedTexSubImage2D
	//glCompressedTexSubImage3D
	//glCopyBufferSubData
	//glCopyTexImage1D
	//glCopyTexImage2D
	//glCopyTexSubImage1D
	//glCopyTexSubImage2D
	//----------glCopyTexSubImage3D
	//----------glCreateProgram
	//----------glCreateShader
	//glCreateShaderProgram
	//glCullFace
	//----------glDeleteBuffers
	//glDeleteFramebuffers
	//----------glDeleteProgram
	//glDeleteProgramPipelines
	//glDeleteQueries
	//glDeleteRenderbuffers
	//glDeleteSamplers
	//----------glDeleteShader
	//glDeleteSync
	//glDeleteTextures
	//glDeleteTransformFeedbacks
	//----------glDeleteVertexArrays
	//glDepthFunc
	//glDepthMask
	//glDepthRange
	//glDepthRangeArray
	//glDepthRangeIndexed
	//----------glDetachShader
	//glDisable                                                       <--- more than one?
	//glDisableVertexAttribArray
	//glDrawArrays
	//glDrawArraysIndirect
	//glDrawArraysInstanced
	//glDrawBuffer
	//----------glDrawBuffers
	//glDrawElements
	//glDrawElementsBaseVertex
	//glDrawElementsIndirect
	//glDrawElementsInstanced
	//glDrawElementsInstancedBaseVertex
	//----------glDrawRangeElements
	//glDrawRangeElementsBaseVertex
	//glDrawTransformFeedback
	//glDrawTransformFeedbackStream
	//glEnable                                                        <--- more than one?
	//----------glEnableVertexAttribArray
	//----------glEndConditionalRender
	//glEndQuery
	//glEndQueryIndexed
	//----------glEndTransformFeedback
	//glFenceSync
	//glFinish
	//glFlush
	//glFlushMappedBufferRange
	//glFramebufferRenderbuffer
	//glFramebufferTexture
	//glFramebufferTextureLayer
	//glFrontFace
	//----------glGenBuffers
	//glGenFramebuffers
	//glGenProgramPipelines
	//glGenQueries
	//glGenRenderbuffers
	//glGenSamplers
	//glGenTextures
	//glGenTransformFeedbacks
	//----------glGenVertexArrays
	//glGenerateMipmap
	//glGet                                                           <--- more than one?
	//----------glGetActiveAttrib
	//glGetActiveSubroutineName
	//glGetActiveSubroutineUniform
	//glGetActiveSubroutineUniformName
	//----------glGetActiveUniform
	//glGetActiveUniformBlock
	//glGetActiveUniformBlockName
	//glGetActiveUniformName
	//glGetActiveUniformsiv
	//----------glGetAttachedShaders
	//----------glGetAttribLocation
	//glGetBufferParameter                                            <--- more than one?
	//----------glGetBufferPointerv
	//----------glGetBufferSubData
	//glGetCompressedTexImage
	//glGetError
	//glGetFragDataIndex
	//----------glGetFragDataLocation
	//glGetFramebufferAttachmentParameter
	//glGetMultisample
	//glGetProgram                                                    <--- more than one?
	//glGetProgramBinary
	//----------glGetProgramInfoLog
	//glGetProgramPipeline
	//glGetProgramPipelineInfoLog
	//glGetProgramStage
	//glGetQueryIndexed
	//glGetQueryObject
	//glGetQueryiv
	//glGetRenderbufferParameter
	//glGetSamplerParameter
	//glGetShader                                                     <--- more than one?
	//----------glGetShaderInfoLog
	//glGetShaderPrecisionFormat
	//----------glGetShaderSource
	//glGetString                                                     <--- more than one?
	//glGetSubroutineIndex
	//glGetSubroutineUniformLocation
	//glGetSync
	//glGetTexImage
	//glGetTexLevelParameter
	//glGetTexParameter                                               <--- more than one?
	//----------glGetTransformFeedbackVarying
	//glGetUniform                                                    <--- more than one?
	//glGetUniformBlockIndex
	//glGetUniformIndices
	//----------glGetUniformLocation
	//glGetUniformSubroutine
	//glGetVertexAttrib                                               <--- more than one?
	//glGetVertexAttribPointerv
	//glHint
	//----------glIsBuffer
	//glIsEnabled                                                     <--- more than one?
	//glIsFramebuffer
	//----------glIsProgram
	//glIsProgramPipeline
	//glIsQuery
	//glIsRenderbuffer
	//glIsSampler
	//----------glIsShader
	//glIsSync
	//glIsTexture
	//glIsTransformFeedback
	//----------glIsVertexArray
	//glLineWidth
	//----------glLinkProgram
	//glLogicOp
	//----------glMapBuffer
	//glMapBufferRange
	//glMinSampleShading
	//glMultiDrawArrays
	//glMultiDrawElements
	//glMultiDrawElementsBaseVertex
	//glPatchParameter
	//glPauseTransformFeedback
	//glPixelStore
	//glPointParameter
	//glPointSize
	//glPolygonMode
	//glPolygonOffset
	//glPrimitiveRestartIndex
	//glProgramBinary
	//glProgramParameter
	//glProgramUniform
	//glProvokingVertex
	//glQueryCounter
	//glReadBuffer
	//glReadPixels
	//glReleaseShaderCompiler
	//glRenderbufferStorage
	//glRenderbufferStorageMultisample
	//glResumeTransformFeedback
	//glSampleCoverage
	//glSampleMaski
	//glSamplerParameter
	//glScissor
	//glScissorArray
	//glScissorIndexed
	//glShaderBinary
	//----------glShaderSource
	//glStencilFunc
	//----------glStencilFuncSeparate
	//glStencilMask
	//glStencilMaskSeparate
	//glStencilOp
	//----------glStencilOpSeparate
	//glTexBuffer
	//glTexImage1D
	//glTexImage2D
	//glTexImage2DMultisample
	//----------glTexImage3D
	//glTexImage3DMultisample
	//glTexParameter                                                  <--- more than one?
	//glTexSubImage1D
	//glTexSubImage2D
	//----------glTexSubImage3D
	//----------glTransformFeedbackVaryings
	//glUniform                                                       <--- more than one?
	//glUniformBlockBinding
	//glUniformSubroutines
	//----------glUnmapBuffer
	//----------glUseProgram
	//glUseProgramStages
	//----------glValidateProgram
	//glValidateProgramPipeline
	//glVertexAttrib                                                  <--- more than one?
	//glVertexAttribDivisor
	//----------glVertexAttribPointer
	//glViewport
	//glViewportArray
	//glViewportIndexed
	//glWaitSync



	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 1.1

	// GL_blend_logic_op
	// GL_copy_texture
	// GL_polygon_offset
	// GL_subtexture
	// GL_texture
	// GL_texture_object
	// GL_vertex_array

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 1.2

	// GL_bgra
	// GL_draw_range_elements
	// GL_packed_pixels
	// GL_rescale_normal
	// GL_separate_specular_color
	// GL_texture3D
	// GL_texture_edge_clamp
	// GL_texture_lod

	// glDrawRangeElements
	// glTexImage3D
	// glTexSubImage3D
	// glCopyTexSubImage3D

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 1.3

	// TODO

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 1.4

	// TODO

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 1.5

	// GL_occlusion_query
	// TODO

	// GL_vertex_buffer_object

	typedef void (__stdcall *PFN_glBindBuffer)( GLenum _eTarget, uint_t _uBuffer );
	extern PFN_glBindBuffer glBindBuffer;

	typedef void (__stdcall *PFN_glDeleteBuffers)( 
		uint_t _uCount, uint_t const *_puBuffers 
		);
	extern PFN_glDeleteBuffers glDeleteBuffers;

	typedef void (__stdcall *PFN_glGenBuffers)( 
		uint_t _uCount, uint_t *_puBuffers 
		);
	extern PFN_glGenBuffers glGenBuffers;

	typedef bool_t (__stdcall *PFN_glIsBuffer)( uint_t _uBuffer );
	extern PFN_glIsBuffer glIsBuffer;

	typedef void (__stdcall *PFN_glBufferData)( 
		GLenum _eTarget, uint_t _uSize, void const *_pData, GLenum _eUsage 
		);
	extern PFN_glBufferData glBufferData;

	typedef void (__stdcall *PFN_glBufferSubData)( 
		GLenum _eTarget, int_t _iOffset, uint_t _uSize, void const *_pData 
		);
	extern PFN_glBufferSubData glBufferSubData;

	typedef void (__stdcall *PFN_glGetBufferSubData)( 
		GLenum _eTarget, int_t _iOffset, uint_t _uSize, void *_pData 
		);
	extern PFN_glGetBufferSubData glGetBufferSubData;

	typedef void *(__stdcall *PFN_glMapBuffer)( GLenum _eTarget, GLenum _eAccess );
	extern PFN_glMapBuffer glMapBuffer;

	typedef bool_t (__stdcall *PFN_glUnmapBuffer)( GLenum _eTarget );
	extern PFN_glUnmapBuffer glUnmapBuffer;

	typedef void (__stdcall *PFN_glGetBufferParameteriv)(     // <--- more than one type?
		GLenum _eTarget, GLenum _eParamName, int_t *_piParams 
		);
	extern PFN_glGetBufferParameteriv glGetBufferParameteriv;

	typedef void (__stdcall *PFN_glGetBufferPointerv)(
		GLenum _eTarget, GLenum _eParamName, void **_ppParams 
		);
	extern PFN_glGetBufferPointerv glGetBufferPointerv;

#define GL_ARRAY_BUFFER                                    0x8892
#define GL_ELEMENT_ARRAY_BUFFER                            0x8893

#define GL_ARRAY_BUFFER_BINDING                            0x8894
#define GL_ELEMENT_ARRAY_BUFFER_BINDING                    0x8895
#define GL_VERTEX_ARRAY_BUFFER_BINDING                     0x8896
#define GL_NORMAL_ARRAY_BUFFER_BINDING                     0x8897
#define GL_COLOR_ARRAY_BUFFER_BINDING                      0x8898
#define GL_INDEX_ARRAY_BUFFER_BINDING                      0x8899
#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING              0x889A
#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING                  0x889B
#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING            0x889C
#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING             0x889D
#define GL_WEIGHT_ARRAY_BUFFER_BINDING                     0x889E

#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING              0x889F

#define GL_STREAM_DRAW                                     0x88E0
#define GL_STREAM_READ                                     0x88E1
#define GL_STREAM_COPY                                     0x88E2
#define GL_STATIC_DRAW                                     0x88E4
#define GL_STATIC_READ                                     0x88E5
#define GL_STATIC_COPY                                     0x88E6
#define GL_DYNAMIC_DRAW                                    0x88E8
#define GL_DYNAMIC_READ                                    0x88E9
#define GL_DYNAMIC_COPY                                    0x88EA

#define GL_READ_ONLY                                       0x88B8
#define GL_WRITE_ONLY                                      0x88B9
#define GL_READ_WRITE                                      0x88BA

#define GL_BUFFER_SIZE                                     0x8764
#define GL_BUFFER_USAGE                                    0x8765
#define GL_BUFFER_ACCESS                                   0x88BB
#define GL_BUFFER_MAPPED                                   0x88BC

#define GL_BUFFER_MAP_POINTER                              0x88BD

	// GL_shadow_funcs
	// TODO

	//glGenQueries
	//glDeleteQueries
	//glISQuery
	//glBeginQuery
	//glEndQuery
	//glGetQueryiv
	//glGetQueryObjectiv
	//glGetQueryObjectuiv

	//#define GL_QUERY_COUNTER_BITS                              0x8864
	//#define GL_CURRENT_QUERY                                   0x8865
	//#define GL_QUERY_RESULT                                    0x8866
	//#define GL_QUERY_RESULT_AVAILABLE                          0x8867
	//#define GL_SAMPLES_PASSED                                  0x8914

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 2.0

	// GL_draw_buffers
	// GL_fragment_shader
	// GL_point_sprite
	// GL_shader_objects
	// GL_shading_language_100
	// GL_texture_non_power_of_two
	// GL_vertex_shader
	// GL_blend_equation_seperate
	// GL_stencil_two_side

	// glAttachShader
	// glBindAttribLocation
	// glCompileShader
	// glCreateProgram
	// glCreateShader
	// glDeleteProgram
	// glDeleteShader
	// glDetachShader
	// glDrawBuffers
	// glGetActiveAttrib
	// glGetActiveUniform
	// glGetAttachedShaders
	// glGetAttribLocation
	// glGetShaderSource
	// glGetShaderiv                                             <--- more than one type?
	// glGetProgramiv                                            <--- more than one type?
	// glGetShaderInfoLog
	// glGetProgramInfoLog
	// glGetUniformLocation
	// glGetUniformfv                                            <--- more than one type?
	// glGetUniformiv                                            ...
	// glIsProgram
	// glIsShader
	// glLinkProgram
	// glShaderSource
	// glStencilFuncSeparate
	// glStencilOpSeparate
	// glUniform1f                                               <--- more than one type?
	// glUniform1fv                                              ...
	// glUniform1i                                               ...
	// glUniform1iv                                              ...
	// glUniform2f                                               ...
	// glUniform2fv                                              ...
	// glUniform2i                                               ...
	// glUniform2iv                                              ...
	// glUniform3f                                               ...
	// glUniform3fv                                              ...
	// glUniform3i                                               ...
	// glUniform3iv                                              ...
	// glUniform4f                                               ...
	// glUniform4fv                                              ...
	// glUniform4i                                               ...
	// glUniform4iv                                              ...
	// glUniformMatrix2fv                                        ...
	// glUniformMatrix3fv                                        ...
	// glUniformMatrix4fv                                        ...
	// glUseProgram
	// glValidateProgram
	// glVertexAttrib1d                                          <--- more than one type?
	// glVertexAttrib1dv                                         ...
	// glVertexAttrib1f                                          ...
	// glVertexAttrib1fv                                         ...
	// glVertexAttrib1s                                          ...
	// glVertexAttrib1sv                                         ...
	// glVertexAttrib2d                                          ...
	// glVertexAttrib2dv                                         ...
	// glVertexAttrib2f                                          ...
	// glVertexAttrib2fv                                         ...
	// glVertexAttrib2s                                          ...
	// glVertexAttrib2sv                                         ...
	// glVertexAttrib3f                                          ...
	// glVertexAttrib3fv                                         ...
	// glVertexAttrib3s                                          ...
	// glVertexAttrib3sv                                         ...
	// glVertexAttrib4Nbv                                        ...
	// glVertexAttrib4Niv                                        ...
	// glVertexAttrib4Nsv                                        ...
	// glVertexAttrib4Nub                                        ...
	// glVertexAttrib4Nubv                                       ...
	// glVertexAttrib4Nuiv                                       ...
	// glVertexAttrib4Nusv                                       ...
	// glVertexAttrib4bv                                         ...
	// glVertexAttrib4d                                          ...
	// glVertexAttribdv                                          ...
	// glVertexAttrib4f                                          ...
	// glVertexAttrib4fv                                         ...
	// glVertexAttrib4iv                                         ...
	// glVertexAttrib4s                                          ...
	// glVertexAttrib4sv                                         ...
	// glVertexAttrib4ubv                                        ...
	// glVertexAttrib4uiv                                        ...
	// glVertexAttrib4usv                                        ...
	// glVertexAttribPointer

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 2.1

	// TODO

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 3.0

	// GL_map_buffer_range

	// GL_vertex_array_object

	typedef void (__stdcall *PFN_glBindVertexArray)( uint_t _uArray );
	extern PFN_glBindVertexArray glBindVertexArray;

	typedef void (__stdcall *PFN_glDeleteVertexArrays)( 
		uint_t _uCount, uint_t const *_puArrays 
		);
	extern PFN_glDeleteVertexArrays glDeleteVertexArrays;

	typedef void (__stdcall *PFN_glGenVertexArrays)( 
		uint_t _uCount, uint_t *_puArrays 
		);
	extern PFN_glGenVertexArrays glGenVertexArrays;

	typedef bool_t (__stdcall *PFN_glIsVertexArray)( uint_t _uArray );
	extern PFN_glIsVertexArray glIsVertexArray;

#define GL_VERTEX_ARRAY_BINDING                        0x85B5

	// GL_color_buffer_float
	// GL_depth_buffer_float
	// GL_framebuffer_object
	// GL_framebuffer_sRGB
	// GL_half_float_pixel
	// GL_texture_compression_rgtc
	// GL_texture_float
	// GL_texture_rg
	// GL_draw_buffers2
	// GL_framebuffers_blit
	// GL_framebuffer_multisample
	// GL_gpu_shader4
	// GL_packed_depth_stencil
	// GL_packed_float
	// GL_texture_array
	// GL_texture_integer
	// GL_texture_shared_exponent
	// GL_transform_feedback
	// GL_conditional_render
	// GL_half_float_vertex

	// glBeginConditionalRender
	// glBeginTransformFeedback
	// glBindBufferBase
	// glBindBufferRange
	// glBindFragDataLocation
	// glClampColor
	// glClearBufferfi                                                <--- more than one?
	// glClearBufferfv                                                ...
	// glClearBufferiv                                                ...
	// glClearBufferuiv                                               ...
	// glColorMaski
	// glDisablei                                                     <--- more than one?
	// glEnablei                                                      <--- more than one?
	// glEndConditionalRender
	// glEndTransformFeedback
	// glGetBooleani_v                                                <--- more than one?
	// glGetFragDataLocation
	// glGetIntegeri_v                                                <--- more than one?
	// glGetStringi                                                   <--- more than one?
	// glGetTexParameterIiv                                           <--- more than one?
	// glGetTexParameterIuiv                                          ...
	// glGetTransformFeedbackVarying
	// glGetUniformuiv                                                <--- more than one?
	// glGetVertexAttribIiv                                           <--- more than one?
	// glGetVertexAttribIuiv                                          ...
	// glIsEnabledi                                                   <--- more than one?
	// glTexParameterIiv                                              <--- more than one?
	// glTexParameterIuiv                                             ...
	// glTransformFeedbackVaryings
	// glUniform1ui                                                   <--- more than one?
	// glUniform1uiv                                                  ...
	// glUniform2ui                                                   ...
	// glUniform2uiv                                                  ...
	// glUniform3ui                                                   ...
	// glUniform3uiv                                                  ...
	// glUniform4ui                                                   ...
	// glUniform4uiv                                                  ...
	// glVertexAttribI1i                                              <--- more than one?
	// glVertexAttribI1iv                                             ...
	// glVertexAttribI1ui                                             ...
	// glVertexAttribI1uiv                                            ...
	// glVertexAttribI2i                                              ...
	// glVertexAttribI2iv                                             ...
	// glVertexAttribI2ui                                             ...
	// glVertexAttribI2uiv                                            ...
	// glVertexAttribI3i                                              ...
	// glVertexAttribI3iv                                             ...
	// glVertexAttribI3ui                                             ...
	// glVertexAttribI3uiv                                            ...
	// glVertexAttribI4bv                                             ...
	// glVertexAttribI4i                                              ...
	// glVertexAttribI4iv                                             ...
	// glVertexAttribI4sv                                             ...
	// glVertexAttribI4ubv                                            ...
	// glVertexAttribI4ui                                             ...
	// glVertexAttribI4uiv                                            ...
	// glVertexAttribIusv                                             ...
	// glVertexAttribIPointer                                         ...

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 3.1

	// TODO

	/////////////////////////////////////////////////////////////////////////////////////
	// GL_VERSION 3.2

	// TODO

	/////////////////////////////////////////////////////////////////////////////////////
	// WGL

	// WGL_pixel_format

	typedef bool_t (__stdcall *PFN_wglGetPixelFormatAttribiv)( 
		HDC _hDC, int_t _iPixelFormat, int_t _iLayerPlane, uint_t _uAttributeCount, 
		int_t const *_piAttributes, int_t *_piValues 
		);
	extern PFN_wglGetPixelFormatAttribiv wglGetPixelFormatAttribiv;

	typedef BOOL (__stdcall *PFN_wglGetPixelFormatAttribfv)( 
		HDC _hDC, int_t _iPixelFormat, int_t _iLayerPlane, uint_t _uAttributeCount, 
		int_t const *_piAttributes, float_t *_pfValues 
		);
	extern PFN_wglGetPixelFormatAttribfv wglGetPixelFormatAttribfv;

	typedef BOOL (__stdcall *PFN_wglChoosePixelFormat)( 
		HDC _hDC, int_t const *_piAttribIList, float_t const *_pfAttribFList, 
		uint_t _uMaxFormats, int_t *_piFormats, uint_t *_uNumFormats 
		);
	extern PFN_wglChoosePixelFormat wglChoosePixelFormat;

#define WGL_NUMBER_PIXEL_FORMATS                       0x2000
#define WGL_DRAW_TO_WINDOW                             0x2001
#define WGL_DRAW_TO_BITMAP                             0x2002
#define WGL_ACCELERATION                               0x2003
#define WGL_NEED_PALETTE                               0x2004
#define WGL_NEED_SYSTEM_PALETTE                        0x2005
#define WGL_SWAP_LAYER_BUFFERS                         0x2006
#define WGL_SWAP_METHOD                                0x2007
#define WGL_NUMBER_OVERLAYS                            0x2008
#define WGL_NUMBER_UNDERLAYS                           0x2009
#define WGL_TRANSPARENT                                0x200A
#define WGL_TRANSPARENT_RED_VALUE                      0x2037
#define WGL_TRANSPARENT_GREEN_VALUE                    0x2038
#define WGL_TRANSPARENT_BLUE_VALUE                     0x2039
#define WGL_TRANSPARENT_ALPHA_VALUE                    0x203A
#define WGL_TRANSPARENT_INDEX_VALUE                    0x203B
#define WGL_SHARE_DEPTH                                0x200C
#define WGL_SHARE_STENCIL                              0x200D
#define WGL_SHARE_ACCUM                                0x200E
#define WGL_SUPPORT_GDI                                0x200F
#define WGL_SUPPORT_OPENGL                             0x2010
#define WGL_DOUBLE_BUFFER                              0x2011
#define WGL_STEREO                                     0x2012
#define WGL_PIXEL_TYPE                                 0x2013
#define WGL_COLOR_BITS                                 0x2014
#define WGL_RED_BITS                                   0x2015
#define WGL_RED_SHIFT                                  0x2016
#define WGL_GREEN_BITS                                 0x2017
#define WGL_GREEN_SHIFT                                0x2018
#define WGL_BLUE_BITS                                  0x2019
#define WGL_BLUE_SHIFT                                 0x201A
#define WGL_ALPHA_BITS                                 0x201B
#define WGL_ALPHA_SHIFT                                0x201C
#define WGL_ACCUM_BITS                                 0x201D
#define WGL_ACCUM_RED_BITS                             0x201E
#define WGL_ACCUM_GREEN_BITS                           0x201F
#define WGL_ACCUM_BLUE_BITS                            0x2020
#define WGL_ACCUM_ALPHA_BITS                           0x2021
#define WGL_DEPTH_BITS                                 0x2022
#define WGL_STENCIL_BITS                               0x2023
#define WGL_AUX_BUFFERS                                0x2024

#define WGL_NO_ACCELERATION                            0x2025
#define WGL_GENERIC_ACCELERATION                       0x2026
#define WGL_FULL_ACCELERATION                          0x2027

#define WGL_SWAP_EXCHANGE                              0x2028
#define WGL_SWAP_COPY                                  0x2029
#define WGL_SWAP_UNDEFINED                             0x202A

#define WGL_TYPE_RGBA                                  0x202B
#define WGL_TYPE_COLORINDEX                            0x202C

	// WGL_create_context_profile

	typedef HGLRC (__stdcall *PFN_wglCreateContextAttribs)( 
		HDC _hDC, HGLRC _hShareContext, int_t const *_pAttribs 
		);
	extern PFN_wglCreateContextAttribs wglCreateContextAttribs;

#define WGL_CONTEXT_MAJOR_VERSION                      0x2091
#define WGL_CONTEXT_MINOR_VERSION                      0x2092
#define WGL_CONTEXT_LAYER_PLANE                        0x2093
#define WGL_CONTEXT_FLAGS                              0x2094
#define WGL_CONTEXT_PROFILE_MASK                       0x9126

#define WGL_CONTEXT_DEBUG_BIT                          0x0001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT             0x0002

#define WGL_CONTEXT_CORE_PROFILE_BIT                   0x00000001
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT          0X00000002

#define WGL_ERROR_INVALID_VERSION                      0x2095
#define WGL_ERROR_INVALID_PROFILE                      0x2096

	// TODO: not sure where these came from

	typedef bool_t (__stdcall *PFN_glVertexAttribPointer)( 
		uint_t _uIndex, int_t _iSize, GLenum _eType, bool_t _bNormalized, 
		uint_t _uStride, void const * _pOffset
		);
	extern PFN_glVertexAttribPointer glVertexAttribPointer;

	typedef bool_t (__stdcall *PFN_glEnableVertexAttribArray)( uint_t _uIndex );
	extern PFN_glEnableVertexAttribArray glEnableVertexAttribArray;
}

// Header Protection
#endif // _GLEXT_H_
